package com.gzsxy.JUC.pool;


import java.util.concurrent.*;

//Executors 工具类  ：3大方法
//使用了线程池之后，使用线程池来创建线程
public class Demo02 {
    public static void main(String[] args) {
        //自定义线程池，工作ThreadPoolExecutor


        //最大线程到底该如何定义
        //1.cpu密集型   几核，就是几，可以保持cpu的效率最高
        //2. IO密集型  > 判断你程序中十分耗IO的线程
        //        程序   15个大型任务  io十分占有资源

        System.out.println("系统cpu核数" + Runtime.getRuntime().availableProcessors());

        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                4, //线程池大小
                Runtime.getRuntime().availableProcessors(), //最大核心线程
                3,  //超时等待3
                TimeUnit.SECONDS,  //单位s
                new LinkedBlockingDeque<>(3), //阻塞队列
                Executors.defaultThreadFactory(),  //线程工厂
                //当队列满了，不处理，AbortPolicy 抛出异常
                //CallerRunsPolicy  队列满了后把交给main线程处理，哪里来的取哪里
                //DiscardPolicy   不抛出异常，满了丢掉
                //DiscardOldestPolicy 尝试与第一个线程竞争，不会抛出异常
                new ThreadPoolExecutor.DiscardPolicy());


        try {
            //最大承载8个  eque+max
            for (int i = 1; i <= 19; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池用完 要关闭线程池
            threadPool.shutdown();
        }
    }
}
